﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BUS;
using DTO;
namespace PhanMemSapThoiKhoaBieu
{
    public class SapThoiKhoaBieu
    {
        private string[][] _BangTKB;

        public string[][] BangTKB
        {
            get { return _BangTKB; }
            set { _BangTKB = value; }
        }

        private List<MonHoc> lstMon;
        private List<GiaoVien> lstGiaoVien;
        private List<TietCoDinh> lstTiet;

        //kiem tra lich day cua giao vien ngoai co trung ko
        public string[][] KiemTraLichTrung(string idGiaoVien, string idMonHoc)
        {
            List<ChiTietThoiKhoaBieuDTO> lst = ChiTietThoiKhoaBieuBUS.LayLichDayCuaGiaoVien(idGiaoVien);
            string[][] _Bang = new string[5][];
            for (int i = 0; i < 5; i++)
            {
                _Bang[i] = new string[6];
            }

            for (int i = 0; i < lst.Count; i++)
            {
                int d = lst[i].Tiet - 1;
                int c = -1;
                switch (lst[i].Thu)
                {
                    case "Thứ 2":
                        c = 0;
                        break;
                    case "Thứ 3":
                        c = 1;
                        break;
                    case "Thứ 4":
                        c = 2;
                        break;
                    case "Thứ 5":
                        c = 3;
                        break;
                    case "Thứ 6":
                        c = 4;
                        break;
                    case "Thứ 7":
                        c = 5;
                        break;
                }

                if (c != -1)
                {
                    _Bang[d][c] = lst[i].IDMonHoc;
                }
            }
            return _Bang;
        }

        public void KhoiTao(List<MonHoc> _lstMon, List<GiaoVien> _lstGiaoVien, List<TietCoDinh> _lstTiet)
        {
            //khoi tao danh sach mon, giao vien, tiet co dinh
            BangTKB = new string[5][];
            for (int i = 0; i < 5; i++)
            {
                BangTKB[i] = new string[6];
            }

            this.lstMon = _lstMon;
            this.lstGiaoVien = _lstGiaoVien;
            this.lstTiet = _lstTiet;
        }

        public void SapTKB(List<MonHoc> _lstMon, List<GiaoVien> _lstGiaoVien, List<TietCoDinh> _lstTiet, ref string _loi)
        {
            KhoiTao(_lstMon, _lstGiaoVien, _lstTiet);
            //buoc 1: sap tiet co dinh
            SapTietCoDinh(_lstTiet, ref _lstMon);

            //buoc 2: sap tiet cua giao vien ngoai
            SapTietNgoai(_lstGiaoVien, ref _lstMon, ref _loi);

            //buoc 3: sap tiet cua giao vien chu nhiem
            SapTietGiaoVienChuNhiem(_lstGiaoVien,ref _lstMon);
        }

        public bool KiemTraDaSapTrongNgay(string tenMonHoc, int ngay)
        {
            for (int tiet = 0; tiet < 5; tiet++)
            {
                if (BangTKB[tiet][ngay] != null && BangTKB[tiet][ngay].CompareTo(tenMonHoc) == 0)
                    return true;
            }
            return false;
        }

        public bool KiemTraDaSapXong(List<MonHoc> _lstMon)
        {
            for (int i = 0; i < _lstMon.Count; i++)
            {
                if (_lstMon[i].SoTietHocTrongTuan != 0)
                    return false;
            }
            return true;
        }

        public void SapTietGiaoVienChuNhiem(List<GiaoVien> _lstGiaoVien, ref List<MonHoc> _lstMon)
        {
            for (int i = 0; i < _lstMon.Count; i++)
            {
                _lstMon[i].TinhBac();
            }
            _lstMon.Sort();
            int index_mon = 0;
            for (int i = 0; i < _lstGiaoVien.Count; i++)
            {
                //duyet qua danh sach giao vien, kiem tra nhung giao vien la GVCN
                if (_lstGiaoVien[i].LaGVCN == true)
                {
                    for (int ngay = 0; ngay < 6; ngay++)
                    {
                        for (int tiet = 0; tiet < 5; tiet++)
                        {
                            if (BangTKB[tiet][ngay] == null)
                            {
                                while (index_mon < lstMon.Count)
                                {
                                    //kiem tra xem mon nay da duoc sap trong ngay chua
                                    if (KiemTraDaSapTrongNgay(_lstMon[index_mon].TenMonHoc, ngay) == false)
                                    {
                                        //kiem tra neu sap vao TKB so tiet co vuot qua muc 5 ko?
                                        int len = tiet + lstMon[index_mon].SoTietTrenBuoi;
                                        if (len <= 5)
                                        {
                                            bool flag = true;
                                            //kiem tra xem co the sap tiet do vao TKB ma ko bi trung tiet day ko?
                                            for (int h = tiet; h < len; h++)
                                            {
                                                if (this.BangTKB[h][ngay] != null)
                                                {
                                                    flag = false;
                                                }
                                            }
                                            if (flag == true)
                                            {
                                                for (int h = tiet; h < len; h++)
                                                {
                                                    this.BangTKB[h][ngay] = _lstMon[index_mon].TenMonHoc;
                                                    _lstMon[index_mon].SoTietHocTrongTuan--;
                                                }
                                                _lstMon[index_mon].TinhBac();
                                                _lstMon.Sort();
                                                index_mon = 0;
                                                if (KiemTraDaSapXong(_lstMon) == true)
                                                    return;
                                                break;
                                            }
                                            else
                                            {
                                                index_mon++;
                                            }
                                        }
                                        //neu mon nay da duoc sap roi
                                        else
                                        {
                                            index_mon++;
                                        }
                                    }
                                    else
                                    {
                                        index_mon++;
                                    }
                                }

                            }
                        }
                    }
                }
            }
        }

        public void SapTietCoDinh(List<TietCoDinh> _lstTiet, ref List<MonHoc> _lstMon)
        {
            for (int i = 0; i < _lstTiet.Count; i++)
            {
                int index_Thu = -1;
                int index_Tiet = -1;
                //kiem tra xem tiet i co phai la tiet co dinh
                if (_lstTiet[i].SapHoacTranh == true)
                {
                    switch(_lstTiet[i].Thu)
                    {
                        case "Thứ 2":
                            index_Thu = 0;
                            break;
                        case "Thứ 3":
                            index_Thu = 1;
                            break;
                        case "Thứ 4":
                            index_Thu = 2;
                            break;
                        case "Thứ 5":
                            index_Thu = 3;
                            break;
                        case "Thứ 6":
                            index_Thu = 4;
                            break;
                        case "Thứ 7":
                            index_Thu = 5;
                            break;
                    }
                    //sap mon hoc do vao thoi khoa bieu
                    if (index_Thu != -1)
                    {
                        index_Tiet = _lstTiet[i].Tiet-1;
                        BangTKB[index_Tiet][index_Thu] = _lstTiet[i].MonHoc;
                        for (int j = 0; j < _lstMon.Count; j++)
                        {
                            if (_lstMon[j].TenMonHoc.CompareTo(_lstTiet[i].MonHoc) == 0)
                            {
                                _lstMon[j].SoTietHocTrongTuan = 0;
                                _lstMon[j].TinhBac();
                            }
                        }
                    }
                }
            }
        }

        public void SapTietNgoaiCon(int index_mon, ref List<MonHoc> _lstMon, string[][] _bang)
        {
            for (int ngay = 0; ngay < 6; ngay++)
            {
                for (int tiet = 0; tiet < 5; tiet++)
                {
                    if (this.BangTKB[tiet][ngay] == null)
                    {
                        if (_lstMon[index_mon].SoTietHocTrongTuan == 0)
                            return;
                        //kiem tra neu sap vao TKB so tiet co vuot qua muc 5 ko?
                        int len = tiet + lstMon[index_mon].SoTietTrenBuoi;
                        if (len < 5)
                        {
                            bool flag = true;
                            //kiem tra xem co the sap tiet do vao TKB ma ko bi trung tiet day ko?
                            for (int h = tiet; h < len; h++)
                            {
                                if (_bang[h][ngay] != null)
                                {
                                    flag = false;
                                    break;
                                }
                            }
                            if (flag == true)
                            {
                                for (int h = tiet; h < len; h++)
                                {
                                    this.BangTKB[h][ngay] = _lstMon[index_mon].TenMonHoc;
                                    _lstMon[index_mon].SoTietHocTrongTuan--;
                                    _lstMon[index_mon].TinhBac();
                                }
                            }
                        }
                    }
                }
            }
        }

        public void SapTietNgoai(List<GiaoVien> _lstGiaoVien, ref List<MonHoc> _lstMon, ref string _loi)
        {
            for (int i = 0; i < _lstGiaoVien.Count; i++)
            {
                int index_mon = -1;
                //duyet qua danh sach giao vien, kiem tra nhung giao vien ko la GVCN
                if (_lstGiaoVien[i].LaGVCN == false)
                {
                    //lay ten mon hoc do giao vien do phu trach
                    for (int t = 0; t < _lstMon.Count;t++)
                    {
                        string tenMon = MonHocBUS.LayTenMonHoc(_lstMon[t].TenMonHoc);
                        if (String.Compare(tenMon, _lstGiaoVien[i].MonHocPhuTrach) == 0)
                        {
                            index_mon = t;
                            break;
                        }
                    }
                    if (index_mon != -1)
                    {
                        //lấy ds lịch dạy cua giao vien do
                        string[][] _bang = KiemTraLichTrung(_lstGiaoVien[i].IdGiaoVien, _lstGiaoVien[i].MonHocPhuTrach);
                        SapTietNgoaiCon(index_mon,ref _lstMon,_bang);
                        if (_lstMon[index_mon].SoTietHocTrongTuan > 0)
                        {
                            _lstMon[index_mon].SoTietHocTrongTuan = 0;
                            _loi = _lstGiaoVien[i].MonHocPhuTrach + "không thể sắp vào TKB. Vui lòng kiểm tra ràng buộc";
                        }
                    }
                }
            }
        }
    }
}
